//
//  ZegoUIKitPrebuiltLiveStreamingVCProtocol.swift
//  Pods
//
//  Created by zego on 2024/1/17.
//

import Foundation

/// 定义一个公共协议，用于规范直播视图控制器的 API 接口
public protocol LiveStreamingVCApi {
    
    /// Add a custom button to the bottom bar.
    /// - Parameters:
    ///   - button: Custom button
    ///   - role: User identity, specifies under what condition the button is displayed.
    
    ///   /// 向底部菜单栏添加一个自定义按钮
    /// - Parameters:
    ///   - button: 要添加到菜单栏的自定义 UIButton 实例。此按钮将被显示在底部菜单栏中，可用于触发特定的操作。
    ///   - role: 用户身份，它指定了在何种用户角色下该按钮会显示在底部菜单栏。例如，可能存在主持人、观众等不同角色，不同角色看到的按钮可能不同。
    ///   - position: 按钮在底部菜单栏中的位置，通过该参数可以指定按钮具体显示在菜单栏的哪个位置。
    func addButtonToBottomMenuBar(_ button: UIButton, role: ZegoLiveStreamingRole, position:ZegoLiveBottomMenuBarPosition)
    
    /// Custom start live button
    /// - Parameter button: Custom ZegoStartLiveButton
    
    /// 设置自定义的开始直播按钮
    /// - Parameter button: 自定义的 ZegoStartLiveButton 实例。使用该自定义按钮来替代默认的开始直播按钮，以满足特定的设计或交互需求
    func setStartLiveButton(_ button: ZegoStartLiveButton)
    
    /// Remove custom buttons that were added to the bottom bar previously.
    /// - Parameter role: The user's identity specifies that only custom buttons added under the corresponding identity should be cleared.
    
    /// 移除之前添加到底部菜单栏的自定义按钮
    /// - Parameter role: 用户身份，指定仅清除在对应身份下添加的自定义按钮。这样可以根据不同的用户角色来管理底部菜单栏中的自定义按钮。
    func clearBottomMenuBarExtendButtons(_ role: ZegoLiveStreamingRole)
    
    /// Custom Live Room Background
    /// - Parameter view: Custom view
    
    /// 设置自定义的直播房间背景视图
    /// - Parameter view: 自定义的 UIView 实例，该视图将作为直播房间的背景展示。可以使用该方法来实现个性化的房间背景效果。
    func setBackgroundView(_ view: UIView)
  
    /// 离开当前的直播房间
    /// 调用此方法后，将执行离开房间的相关操作，如断开与房间的连接、清理资源等。
    func leaveRoom()
  
    // 向指定的直播房间发送弹幕消息
    /// - Parameters:
    ///   - roomID: 要发送弹幕消息的房间的唯一标识符。通过该 ID 可以确定消息要发送到哪个具体的房间。
    ///   - message: 要发送的弹幕消息内容，是一个字符串类型。
    ///   - callback: 消息发送结果的回调函数，可选参数。如果提供了该回调，当消息发送完成后，会调用此回调并传递错误码和错误信息。
    func sendBarrageMessage(roomID: String , message: String, callback: ((_ errorCode: Int,_ errorMsg: String) -> Void)?)
}
